/**
 * 为deputy_general_base表添加性别字段并设置性别值
 * 根据列名判断性别，star_level为4的副将性别全部为男
 */

const mysql = require('mysql2/promise');

// 数据库连接配置
const dbConfig = {
    host: '43.143.253.188',
    port: 3306,
    user: 'nextjs',
    password: 'yEAiRE2jcxTyRBy5',
    database: 'nextjs',
    charset: 'utf8mb4'
};

class DeputyBaseSexUpdater {
    constructor() {
        this.connection = null;
    }

    // 连接数据库
    async connect() {
        try {
            this.connection = await mysql.createConnection(dbConfig);
            console.log('✅ 数据库连接成功');
        } catch (error) {
            console.error('❌ 数据库连接失败:', error.message);
            throw error;
        }
    }

    // 断开数据库连接
    async disconnect() {
        if (this.connection) {
            await this.connection.end();
            console.log('🔌 数据库连接已断开');
        }
    }

    // 添加性别字段
    async addSexField() {
        try {
            console.log('🔧 开始添加性别字段...');

            // 检查字段是否已存在
            const [columns] = await this.connection.execute(`
                SELECT COLUMN_NAME 
                FROM INFORMATION_SCHEMA.COLUMNS 
                WHERE TABLE_SCHEMA = 'nextjs' 
                AND TABLE_NAME = 'deputy_general_base' 
                AND COLUMN_NAME = 'sex'
            `);

            if (columns.length > 0) {
                console.log('ℹ️ 性别字段已存在，跳过添加');
                return;
            }

            // 添加性别字段
            await this.connection.execute(`
                ALTER TABLE deputy_general_base 
                ADD COLUMN sex TINYINT DEFAULT 0 COMMENT '性别(0:女,1:男)'
            `);

            console.log('✅ 性别字段添加成功');
        } catch (error) {
            console.error('❌ 添加性别字段失败:', error.message);
            throw error;
        }
    }

    // 根据列名判断性别
    getSexByName(name) {
        if (!name) return 0; // 默认为女

        const nameStr = name.toLowerCase();

        // 男性名字特征
        const maleNames = [
            '男', '雄', '公', '郎', '君', '子', '夫', '父', '兄', '弟',
            '武', '勇', '刚', '强', '豪', '杰', '英', '雄', '霸', '王',
            '龙', '虎', '豹', '狼', '鹰', '雕', '鹏', '鲲', '鲲鹏',
            '天', '地', '山', '海', '江', '河', '湖', '海', '峰', '岳',
            '云', '风', '雷', '电', '火', '炎', '烈', '猛', '威', '势',
            '军', '将', '帅', '兵', '士', '卒', '战', '斗', '争', '胜',
            '文', '武', '智', '勇', '仁', '义', '礼', '信', '忠', '孝'
        ];

        // 女性名字特征
        const femaleNames = [
            '女', '雌', '母', '娘', '姬', '妃', '后', '妻', '妇', '女',
            '花', '草', '叶', '枝', '柳', '梅', '兰', '竹', '菊', '莲',
            '月', '星', '云', '霞', '虹', '彩', '光', '明', '亮', '清',
            '柔', '软', '娇', '媚', '美', '丽', '艳', '香', '甜', '蜜',
            '春', '夏', '秋', '冬', '雪', '霜', '露', '雨', '雾', '烟',
            '琴', '棋', '书', '画', '诗', '词', '歌', '舞', '乐', '音'
        ];

        // 检查是否包含男性特征
        for (const maleName of maleNames) {
            if (nameStr.includes(maleName)) {
                return 1; // 男
            }
        }

        // 检查是否包含女性特征
        for (const femaleName of femaleNames) {
            if (nameStr.includes(femaleName)) {
                return 0; // 女
            }
        }

        // 根据名字长度和结构判断
        if (nameStr.length <= 2) {
            // 短名字，根据常见模式判断
            if (nameStr.includes('子') || nameStr.includes('儿')) {
                return 0; // 女
            }
            if (nameStr.includes('郎') || nameStr.includes('君')) {
                return 1; // 男
            }
        }

        // 默认为女
        return 0;
    }

    // 更新性别字段
    async updateSexField() {
        try {
            console.log('🔄 开始更新性别字段...');

            // 获取所有副将基础数据
            const [rows] = await this.connection.execute(`
                SELECT id, name, star_level, py_name 
                FROM deputy_general_base 
                ORDER BY id
            `);

            console.log(`📊 找到${rows.length}个副将基础数据`);

            let updatedCount = 0;
            let maleCount = 0;
            let femaleCount = 0;

            for (const row of rows) {
                let sex = 0; // 默认为女

                // 如果star_level为4，性别为男
                if (row.star_level === 4) {
                    sex = 1;
                    maleCount++;
                } else {
                    // 根据名字判断性别
                    sex = this.getSexByName(row.name);
                    if (sex === 1) {
                        maleCount++;
                    } else {
                        femaleCount++;
                    }
                }

                // 更新性别字段
                await this.connection.execute(`
                    UPDATE deputy_general_base 
                    SET sex = ? 
                    WHERE id = ?
                `, [sex, row.id]);

                updatedCount++;

                // 每100个显示进度
                if (updatedCount % 100 === 0) {
                    console.log(`📈 已更新${updatedCount}/${rows.length}个副将`);
                }
            }

            console.log('✅ 性别字段更新完成');
            console.log(`📊 统计结果:`);
            console.log(`   总数量: ${updatedCount}`);
            console.log(`   男性: ${maleCount}`);
            console.log(`   女性: ${femaleCount}`);

        } catch (error) {
            console.error('❌ 更新性别字段失败:', error.message);
            throw error;
        }
    }

    // 验证更新结果
    async verifyUpdate() {
        try {
            console.log('🔍 开始验证更新结果...');

            // 统计各性别的数量
            const [sexStats] = await this.connection.execute(`
                SELECT sex, COUNT(*) as count 
                FROM deputy_general_base 
                GROUP BY sex
            `);

            console.log('📊 性别统计:');
            sexStats.forEach(stat => {
                const gender = stat.sex === 1 ? '男' : '女';
                console.log(`   ${gender}: ${stat.count}个`);
            });

            // 验证star_level为4的副将性别
            const [star4Stats] = await this.connection.execute(`
                SELECT sex, COUNT(*) as count 
                FROM deputy_general_base 
                WHERE star_level = 4 
                GROUP BY sex
            `);

            console.log('📊 star_level为4的副将性别统计:');
            star4Stats.forEach(stat => {
                const gender = stat.sex === 1 ? '男' : '女';
                console.log(`   ${gender}: ${stat.count}个`);
            });

            // 显示一些示例数据
            const [samples] = await this.connection.execute(`
                SELECT id, name, star_level, sex, py_name 
                FROM deputy_general_base 
                ORDER BY RAND() 
                LIMIT 10
            `);

            console.log('📋 随机示例数据:');
            samples.forEach(sample => {
                const gender = sample.sex === 1 ? '男' : '女';
                console.log(`   ID:${sample.id} ${sample.name} (${sample.py_name}) - 星级:${sample.star_level} 性别:${gender}`);
            });

        } catch (error) {
            console.error('❌ 验证更新结果失败:', error.message);
            throw error;
        }
    }

    // 运行完整流程
    async run() {
        try {
            console.log('🚀 开始为deputy_general_base表添加性别字段...\n');

            // 1. 连接数据库
            await this.connect();

            // 2. 添加性别字段
            await this.addSexField();

            // 3. 更新性别字段
            await this.updateSexField();

            // 4. 验证更新结果
            await this.verifyUpdate();

            console.log('\n🎉 所有操作完成！');

        } catch (error) {
            console.error('💥 操作失败:', error.message);
            throw error;
        } finally {
            // 5. 断开连接
            await this.disconnect();
        }
    }
}

// 运行脚本
async function main() {
    const updater = new DeputyBaseSexUpdater();
    await updater.run();
}

// 如果直接运行此脚本
if (require.main === module) {
    main().catch((error) => {
        console.error('💥 脚本执行失败:', error.message);
        process.exit(1);
    });
}

module.exports = DeputyBaseSexUpdater;

